﻿using System;
using System.Collections;
using System.Linq;
using System.Text;

namespace Bowling.Game
{
    /// <summary>
    /// 진행중이 게임의 정보를 포함합니다.
    /// </summary>
    public class GameInfo
    {
        //현재 게임이 DB에 등록되었는지를 체크하기 위한 Seq
        public int recordSeq;

        public UserInfo userInfo;
        public DateTime playDate;
        public DateTime endDate;

        //각 프레임의 스트라이크, 스페어 상태를 가지는 값(2 = 스트라이크, 1= 스페어, 0= next프레임)
        public int[] frameState;

        public int[] score;            
        public int[] throws;

        //스트라이크, 스페어의 점수 표시를 위한 딜레이 정보를 가지는 리스트
        public ArrayList waitFrameList;


        public GameInfo(UserInfo userInfo, DateTime playDate)
        {
            this.recordSeq = -1;
            this.userInfo = userInfo;
            this.score = new int[10];
            this.frameState = new int[10];
            this.throws = new int[21];
            this.playDate = playDate;
            //this.endDate = playDate;
            this.waitFrameList = new ArrayList();
        }

        /// <summary>
        /// 각 프레임 점수를 기록합니다
        /// </summary>
        /// <remarks>
        /// 작성자: 권혁준
        /// </remarks>
        /// <param name="frameNo"></param>
        /// <param name="score"></param>
        public void SetFrameScore(int frameNo, int score)
        {
            this.score[frameNo - 1] = score;
        }

        /// <summary>
        /// 각 프레임의 던진 횟수에 따른 점수들을 기록합니다.
        /// </summary>
        /// <remarks>
        /// 작성자: 권혁준
        /// </remarks>
        /// <param name="frameNo">현재 프레임 번호</param>
        /// <param name="throwCnt">프레임의 던지는 횟수</param>
        /// <param name="score">던지는 회차의 점수</param>
        public void SetPinScore(int frameNo, int throwCnt, int score)
        {
            switch (frameNo.ToString())
            {
                case "1":
                    if (throwCnt == 1)
                    {
                        this.throws[0] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[1] = score;
                    }
                    break;
                case "2":
                    if (throwCnt == 1)
                    {
                        this.throws[2] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[3] = score;
                    }
                    break;
                case "3":
                    if (throwCnt == 1)
                    {
                        this.throws[4] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[5] = score;
                    }
                    break;
                case "4":
                    if (throwCnt == 1)
                    {
                        this.throws[6] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[7] = score;
                    }
                    break;
                case "5":
                    if (throwCnt == 1)
                    {
                        this.throws[8] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[9] = score;
                    }
                    break;
                case "6":
                    if (throwCnt == 1)
                    {
                        this.throws[10] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[11] = score;
                    }
                    break;
                case "7":
                    if (throwCnt == 1)
                    {
                        this.throws[12] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[13] = score;
                    }
                    break;
                case "8":
                    if (throwCnt == 1)
                    {
                        this.throws[14] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[15] = score;
                    }
                    break;
                case "9":
                    if (throwCnt == 1)
                    {
                        this.throws[16] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[17] = score;
                    }
                    break;
                case "10":
                    if (throwCnt == 1)
                    {
                        this.throws[18] = score;
                    }
                    else if (throwCnt == 2)
                    {
                        this.throws[19] = score;
                    }
                    else if (throwCnt == 3)
                    {
                        this.throws[20] = score;
                    }
                    break;
            }
        }

        /// <summary>
        /// 각 프레임의 스트라이크 상태를 셋하고 waitFrameList에 상태를 추가합니다.
        /// </summary>
        /// <remarks>
        /// 작성자: 권혁준
        /// </remarks>
        /// <param name="frameNo"></param>
        /// <param name="score"></param>
        public void Strike(int frameNo, int score)
        {
            frameState[frameNo - 1] = 2;
            waitFrameList.Add(new WaitFrameScore(frameNo, 2, score));
        }

        /// <summary>
        /// 각 프레임의 스페어 상태를 셋하고 waitFrameList에 상태를 추가합니다.
        /// </summary>
        /// <remarks>
        /// 작성자: 권혁준
        /// </remarks>
        /// <param name="frameNo"></param>
        /// <param name="score"></param>
        public void Spare(int frameNo, int score)
        {
            frameState[frameNo - 1] = 1;
            waitFrameList.Add(new WaitFrameScore(frameNo, 1, score));
        }

        /// <summary>
        /// 각 프레임의 next frame 상태로 셋하고 waitFrameList에 상태를 추가합니다.
        /// </summary>
        /// <remarks>
        /// 작성자: 권혁준
        /// </remarks>
        /// <param name="frameNo"></param>
        /// <param name="score"></param>
        public void NextFrame(int frameNo, int score)
        {
            frameState[frameNo - 1] = 0;
            waitFrameList.Add(new WaitFrameScore(frameNo, 0, score));
        }
        
    }
}
